home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
smsrc
/
sm
/
idcmp.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-07-11
|
7KB
|
298 lines
Procedure DoShell(n : pMyNode);
VAR
nd : pMyNode;
begin
if n^.LSK_NewShell then begin
nd := AllocMem(sizeof(tMyNode), MEMF_CLEAR);
if nd <> NIL then begin
if n^.LSK_ShellFrom <> '' then
nd^.LSK_Cmd[1] := 'NewShell FROM '+n^.LSK_ShellFrom
else
nd^.LSK_Cmd[1] := 'NewShell';
if n^.LSK_ShellWin <> '' then
nd^.LSK_Cmd[1] := nd^.LSK_Cmd[1]+' WINDOW '+n^.LSK_ShellWin+#0
else
nd^.LSK_Cmd[1] := nd^.LSK_Cmd[1]+#0;
nd^.LSK_ASynch := True;
nd^.LSK_Output := 'NIL:';
if NOT StartCLIProgram(nd) then begin end;
FreeMem_(nd, Sizeof(tMyNode));
end;
end;
end;
{ IDCMP loop }
Function HandleIDCMP;
Const
exitflag : Boolean = False;
rc : shortint = 0;
j : Integer = 1;
Ticks : LONG = 0;
Var
dummy, w1mask, w2mask : longint;
Tags : Array[0..1] of tTagItem;
message : pIntuiMessage;
MsgClass : LongInt;
MsgCode : Word;
gadcode : pGadget;
StrInfo : pStringInfo;
found : boolean;
node : pMyNode;
tf : pTextFont;
it, it2 : tIntuiText;
txt, txt2 : String;
secs : Long;
cdt : pDateTime;
ds : pDateStamp;
tg : pTagItem;
Procedure UpDate_RAM_Time;
VAR
OK : Boolean;
mem : LONG;
begin
if (ds <> NIL) and (cdt <> NIL) and (window2 <> NIL) then begin
ds := DateStamp(ds);
With cdt^ do
dat_Stamp := ds^;
OK := DateToStr(cdt);
txt2 := 'Time : '+PtrToPas(@txt2[1])+#0;
mem := (AvailMem(0));
Str(mem, txt);
txt := 'Free memory : '+txt+' bytes '#0;
PrintIText(Window2^.RPort, @it, 0, 0);
end;
end;
Function DoGad(GadNode : pMyNode) : Boolean;
VAR
QuitAfter : Boolean;
begin
QuitAfter := False;
DisableWindow(TheWindow, @DummyReq, waitpointer);
if CD.cd_Rexx then begin
if GadNode^.LSK_Quit then
SendARexxCommand(CD.cd_RexxCmd3, CD.cd_RexxPort3);
SendARexxCommand(GadNode^.LSK_RexxCmd, GadNode^.LSK_RexxPort);
end;
if NOT CD.cd_Test Then begin
If GadNode^.LSK_Quit Then
ScreenToBack(TheScreen);
WriteLogFile(lf, GadNode, False);
if NOT StartCLIProgram(GadNode) then begin
{ launch failure }
QuitAfter := false;
DisplayBeep(NIL);
end else begin
{ launch success }
DoShell(GadNode);
if GadNode^.LSK_Quit then begin
QuitAfter := true;
end else begin
CD.cd_Wait := 0; {disable time out}
end;
end;
end else begin
{ Test mode }
rc := rtEZRequestA(CSCPAR(@RememberKey, 'Gadget Selected : ' +
GadNode^.LSK_Name+'"'),
CSCPAR(@RememberKey,'OK'),NIL,NIL,@Tags);
If GadNode^.LSK_Quit then
QuitAfter := true
else begin
QuitAfter := False;
end
end;
EnableWindow(TheWindow, @DummyReq, WindowIDCMP);
if CD.cd_ScrT = ST_RAM then
UpDate_RAM_Time;
DoGad := QuitAfter;
end;
begin
ds := AllocVec(Sizeof(tDateStamp), MEMF_CLEAR);
cdt := AllocVec(Sizeof(tDateTime), MEMF_CLEAR);
if cdt <> NIL then begin
With cdt^ do begin
dat_Format := 4;
dat_StrTime := @txt2[1];
end;
end;
it.FrontPen := 1;
it.BackPen := 0;
it.Drawmode := JAM2;
it.LeftEdge := 0;
it.TopEdge := 2;
it.ITextFont := @CD.cd_Font;
it.IText := @txt[1];
it.NextText := @it2;
it2 := it;
it2.TopEdge := it2.TopEdge+CD.cd_Font.ta_YSize;
it2.IText := @txt2[1];
it2.NextText := NIL;
Tags[0].ti_Tag := RT_Window;
Tags[0].ti_Data := Long(TheWindow);
Tags[1].ti_Tag := TAG_END;
{ Open font and set it as the current rastport font }
tf := OpenDiskFont(@CD.cd_SFont);
SetFont(TheWindow^.RPort, tf);
{ Set the current pen to register 1 (normally black) }
SetAPen(TheWindow^.RPort, 1);
w1mask := BitMask(TheWindow^.UserPort^.MP_SIGBIT);
if window2 <> NIL then
w2mask := BitMask(Window2^.UserPort^.MP_SIGBIT)
else
w2mask := 0;
{ Loop until exitflag is false, ie a gadget has been pressed }
While Not exitflag Do Begin
{ Wait on our port }
dummy := Wait(w1mask|w2mask);
if ((dummy and w2mask) <> 0) then begin
message := GT_GetIMsg(Window2^.userPort);
While message <> NIL do begin
MsgClass := message^.Class;
if MsgClass = IDCMP_IDCMPUPDATE then begin
tg := pTagItem(message^.IAddress);
while tg^.ti_Tag <> TAG_END do begin
If tg^.ti_Tag = DTA_Sync then begin
RefreshDTObjectA (dto, window2, NIL, NIL);
end;
tg := pTagItem(LONG(tg)+Sizeof(tTagItem));
end;
end;
if MsgClass = IDCMP_REFRESHWINDOW then begin
GT_BeginRefresh(Window2);
GT_EndRefresh(Window2, True);
end;
GT_ReplyIMsg(message);
message := GT_GetIMsg(Window2^.userPort);
end;
end;
if ((dummy and w1mask) <> 0) then begin
message := GT_GetIMsg(TheWindow^.userPort);
while message <> NIL do begin
MsgClass := message^.Class;
MsgCode := message^.Code;
secs := message^.Seconds;
{ only copy if it is a pointer to a gadget }
if MsgClass = IDCMP_GADGETUP then begin
GadCode := pGadget(message^.IAddress);
StrInfo := gadcode^.SpecialInfo;
end else begin
GadCode := NIL;
StrInfo := NIL;
end;
{ Reply as we've copied all information required }
GT_ReplyIMsg(message);
Case MsgClass Of
IDCMP_CLOSEWINDOW : begin
{$IFDEF DEBUG}
Writeln('-->IDCMP_CLOSEWINDOW');
{$ENDIF}
{ close selected so exit }
exitflag := true;
rc := 10;
WriteLogFile(lf, NIL, True);
end;
IDCMP_REFRESHWINDOW :
{$IFDEF DEBUG}
Begin
Writeln('-->IDCMP_REFRESHWINDOW');
{$ENDIF}
RefreshWin;
{$IFDEF DEBUG}
end;
{$ENDIF}
IDCMP_INTUITICKS : begin
{$IFDEF DEBUG}
{$IFDEF DEBUGITICKS}
Writeln('-->IDCMP_INTUITICKS');
{$ENDIF}
{$ENDIF}
inc(Ticks);
if (Ticks >= (CD.cd_Wait*10)) and (CD.cd_Wait > 0) then begin
exitflag := true;
rc := 10;
end;
if CD.cd_Wit then
{ Scroll text along the bottom of the window }
ScrollText(TheWindow^.RPort, sizes[S_WB_L]+5, base,
(TheWindow^.Width-sizes[S_WB_L]-Sizes[S_WB_R]-10), CD.cd_SFont.ta_YSize, j,
CD.cd_WitTxt);
if (CD.cd_ScrT = ST_RAM) and (Odd(Ticks)) then
UpDate_RAM_Time;
end;
IDCMP_GADGETUP : If NOT exitflag then Begin
{$IFDEF DEBUG}
Writeln('-->IDCMP_GADGETUP');
{$ENDIF}
{ launch command pointed to by the gadgets userdata and set exitflag }
{ just to be sure }
if GadCode^.GadgetID = 1 then begin
node := pMyNode(GadCode^.UserData);
ExitFlag := DoGad(node);
end;
end;
IDCMP_VANILLAKEY : if NOT exitflag then begin
{ traverse thru list searching for a node with a LSK_Key
that matches the character pressed. If found launch
command and set loopflag }
{$IFDEF DEBUG}
Writeln('-->IDCMP_VANILLAKEY');
{$ENDIF}
node := pMyNode(CurrentList^.lh_Head);
found := false;
While (pMyNode(node^.LSK_Node.ln_Succ) <> NIL) AND (NOT Found) do begin
if UpCase(chr(msgcode)) = node^.LSK_Key[1] then
found := true
else
node := pMyNode(node^.LSK_Node.ln_Succ);
end;
If found then begin
ExitFlag := DoGad(node);
end else DisplayBeep(TheScreen);
end;
End;
message := GT_GetIMsg(TheWindow^.userPort);
end;
end;
End;
if cdt <> NIL then
FreeVec(cdt);
if ds <> NIL then
FreeVec(ds);
CloseFont(tf);
HandleIdcmp := rc;
End;